EC2を複数起動、停止させるGem「multi_ec2_kiq」を作りました
はじめに
複数のEC2を起動し、停止させるGemを作りました。恐らくは同じ様な機能を持つGemや、または別の仕組みもあるとは思いますが、作りたいものを作ったという感じです。
multi_ec2_kiqの概要
先にも書いたように、複数のEC2を起動させる機能を持ちます。対象とするEC2はymlにて定義することが可能です。EC2を起動時、起動したEC2のインスタンスIDと(起動したという)ステータスをDynamoDB上のテーブルに保持します。EC2を停止させたい時はDynamoDB上のステータスを変更することで、本GemがEC2を停止させます。
想定する使用例
バッチ処理などで複数のEC2を起動し、各EC2内での処理終了後にDynamoDBのステータスを変える → multi_ec2_kiqがEC2を停止する、というような用途を想定しています。
使用方法
事前準備
~/.aws/credentialsファイルに、AWSへの接続情報を定義しておく必要があります。
インストール
Gemfileにmulti_ec2_kiqを指定してbundle installすることで、インストールされます。
Gemfile
gem 'multi_ec2_kiq'
ymlファイル
先にも書きましたが、ymlファイルに起動したいEC2などの定義を記述します。ymlのファイル名、配置パスは指定できるので、好きな名前にして構いません。インストール時には「lib/settings.yml」にサンプルが入っているので、これを参考にして記述してください。
lib/settings.yml
aws: profile: your_aws_credencial_profile #~/.aws/credentialsのプロファイル名 dynamodb: region: your_dynamodb_region #DynamoDBのリージョン status_table_name: your_ec2_statuses_table_mmae #DynamoDBにてEC2のステータスを保持するテーブルの名称 wait_to_stop: #EC2を起動後、停止を実行するまで待機するポーリング処理 max_attempts: 10 #ポーリング回数 delay: 10 #ポーリング間隔(秒) instances: - id: your_ec2_instance_id_1 #起動対象のEC2インスタンスID(先頭に-をつけること) region: your_ec2_instance_id_1_region #起動対象のEC2インスタンスのリージョン - id: your_ec2_instance_id_2 region: your_ec2_instance_id_2_region
テーブルの作成
※この手順は、EC2を起動するのみの(停止はしない)場合は不要です。
EC2のステータスを保持するテーブルを、DynamoDB上に作成する必要があります。テーブル名は上記のymlに定義した名称となります。テーブルを作成するには、multi_ec2_kiqが用意している「create_status_table」メソッドをirbやRails Consoleなどから呼び出してください。
require "multi_ec2_kiq" include MultiEc2Kiq MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__) MultiEc2Kiq.create_status_table
実行すると、以下の様な定義でテーブルが作成されます。
カラム名 | 型 | 値 |
---|---|---|
instance_id | 文字列 | 起動したEC2のインスタンスID |
status | 文字列 | 起動したEC2のステータス("started":起動完了,"stopped":停止完了,"to_stop":停止実行) |
EC2の起動(停止なし)
EC2を起動するのみで停止しない場合は、multi_ec2_kiqが用意している「start」メソッドを呼び出します。
require "multi_ec2_kiq" include MultiEc2Kiq MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__) MultiEc2Kiq.start
EC2の起動〜停止
EC2を起動して停止させるためには、multi_ec2_kiqが用意している「start_wait_until_stop」メソッドを呼び出します。
require "multi_ec2_kiq" include MultiEc2Kiq MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__) MultiEc2Kiq.start_wait_until_stop
起動するとDynamoDBのテーブルは以下の様なレコードが作成されます(2つEC2を起動した場合)。
instance_id | status i-000aa01 | started i-000aa02 | started
EC2を停止させたい場合は、DynamoDBのレコードを以下のように変更します(i-000aa01を停止させる場合)。
instance_id | status i-000aa01 | to_stop i-000aa02 | started
statusが"to_stop"のレコードが出来た場合、multi_ec2_kiqは対象のEc2を停止します。停止後はDynamoDBのレコードを更新し、以下のようになります。
instance_id | status i-000aa01 | stopped i-000aa02 | started
まとめ
multi_ec2_kiqは実案件で使っている訳ではないので不便な点や不具合等もあるかもしれません。その場合、もしくは似た様なことを行いたい場合は、ソースは公開しているので参考にしてみてください。何かの時の一助になれば幸いです。